package utils

import (
	"encoding/json"
	"fmt"
	"ota/lib/trace_log"
	"runtime"
	"runtime/debug"
)

func Throw(err error) {
	if err != nil {
		panic(err)
	}
}

func ExceptionCatch() {
	if err := recover(); err != nil {
		trace_log.ErrorLogger.Info("Exception err:", err, " \n stack:", string(debug.Stack()))
	}
}

func ToJsonString(data interface{}) string {
	return string(toJson(data))
}

func ToJsonBytes(data interface{}) []byte {
	return toJson(data)
}

func toJson(data interface{}) []byte {
	if data == nil {
		return nil
	}
	marshal, _ := json.Marshal(data)
	return marshal
}

// SqlLike sql模糊查询
func SqlLike(col *string) string {
	return fmt.Sprintf("%v", "%"+*col+"%")
}

func GetValuePointer[T any](value T) *T {
	return &value
}

func Stack() string {
	var buf [2 << 10]byte
	return string(buf[:runtime.Stack(buf[:], true)])
}

func SplitSlice[T any](slice []T, m int) [][]T {

	// 计算切片的长度
	sliceLen := len(slice)

	// 计算切片可以被分割成几份
	numParts := sliceLen / m
	if sliceLen%m != 0 {
		numParts++
	}

	// 创建结果切片
	result := make([][]T, numParts)

	// 遍历原始切片并分割
	for i := 0; i < numParts; i++ {
		start := i * m
		end := start + m
		if end > sliceLen {
			end = sliceLen
		}
		result[i] = make([]T, end-start)
		copy(result[i], slice[start:end])
	}

	return result
}
